﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Chilis.Franquicias.EnEntidad;
using Chilis.Franquicias.DaDatos.Helper;

namespace Chilis.Franquicias.DaDatos
{
    public class CandidatoDaDatos
    {
        private Database oDatabase = EnterpriseLibraryContainer.Current.GetInstance<Database>(Conexion.cnsSql);

        public ListaFQ_Departamento ListaDepartamento()
        {
            ListaFQ_Departamento oListaFQ_Departamento = new ListaFQ_Departamento();
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(Procedimientos.USP_SEL_FQ_DEPARTAMENTO))
            {
                FQ_Departamento oFQ_Departamento = new FQ_Departamento();
                int indiceFQ_Departamento_ID = oIDataReader.GetOrdinal("FQ_Departamento_ID");
                int indicenombre = oIDataReader.GetOrdinal("nombre");

                while (oIDataReader.Read())
                {
                    oFQ_Departamento = new FQ_Departamento();
                    oFQ_Departamento.FQ_Departamento_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Departamento_ID]);
                    oFQ_Departamento.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indicenombre]);
                    oListaFQ_Departamento.Add(oFQ_Departamento);
                }
            }
            return oListaFQ_Departamento;
        }

        public ListaFQ_Provincia ListaProvincia(Int32 FQ_Departamento_ID)
        {
            ListaFQ_Provincia oListaFQ_Provincia = new ListaFQ_Provincia();
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(Procedimientos.USP_SEL_FQ_PROVINCIA,FQ_Departamento_ID))
            {
                FQ_Provincia oFQ_Provincia = new FQ_Provincia();
                int indiceFQ_Provincia_ID = oIDataReader.GetOrdinal("FQ_Provincia_ID");
                int indicenombre = oIDataReader.GetOrdinal("nombre");

                while (oIDataReader.Read())
                {
                    oFQ_Provincia = new FQ_Provincia();
                    oFQ_Provincia.FQ_Provincia_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Provincia_ID]);
                    oFQ_Provincia.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indicenombre]);
                    oListaFQ_Provincia.Add(oFQ_Provincia);
                }
            }
            return oListaFQ_Provincia;
        }

        public ListaFQ_Distrito ListaDistrito(Int32 FQ_Provincia_ID)
        {
            ListaFQ_Distrito oListaFQ_Distrito = new ListaFQ_Distrito();
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(Procedimientos.USP_SEL_FQ_DISTRITO, FQ_Provincia_ID))
            {
                FQ_Distrito oFQ_Distrito = new FQ_Distrito();
                int indiceFQ_Distrito_ID = oIDataReader.GetOrdinal("FQ_Distrito_ID");
                int indicenombre = oIDataReader.GetOrdinal("nombre");

                while (oIDataReader.Read())
                {
                    oFQ_Distrito = new FQ_Distrito();
                    oFQ_Distrito.FQ_Distrito_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Distrito_ID]);
                    oFQ_Distrito.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indicenombre]);
                    oListaFQ_Distrito.Add(oFQ_Distrito);
                }
            }
            return oListaFQ_Distrito;
        }

        public ListaFQ_TipoCandidato ListaTipoCandidato()
        {
            ListaFQ_TipoCandidato oListaFQ_TipoCandidato = new ListaFQ_TipoCandidato();
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(Procedimientos.USP_SEL_FQ_TIPOCANDIDATO))
            {
                FQ_TipoCandidato oFQ_TipoCandidato = new FQ_TipoCandidato();
                int indiceTipoCandidato_ID = oIDataReader.GetOrdinal("TipoCandidato_ID");
                int indiceNombre = oIDataReader.GetOrdinal("Nombre");

                while (oIDataReader.Read())
                {
                    oFQ_TipoCandidato = new FQ_TipoCandidato();
                    oFQ_TipoCandidato.TipoCandidato_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceTipoCandidato_ID]);
                    oFQ_TipoCandidato.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indiceNombre]);
                    oListaFQ_TipoCandidato.Add(oFQ_TipoCandidato);
                }
            }
            return oListaFQ_TipoCandidato;
        }

        public ListaFQ_TipoDocumento ListaTipoDocumento()
        {
            ListaFQ_TipoDocumento oListaFQ_TipoDocumento = new ListaFQ_TipoDocumento();
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(Procedimientos.USP_SEL_FQ_TIPODOCUMENTO))
            {
                FQ_TipoDocumento oFQ_TipoDocumento = new FQ_TipoDocumento();
                int indiceTipoDocumento_ID = oIDataReader.GetOrdinal("TipoDocumento_ID");
                int indiceNombre = oIDataReader.GetOrdinal("Nombre");

                while (oIDataReader.Read())
                {
                    oFQ_TipoDocumento = new FQ_TipoDocumento();
                    oFQ_TipoDocumento.TipoDocumento_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceTipoDocumento_ID]);
                    oFQ_TipoDocumento.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indiceNombre]);
                    oListaFQ_TipoDocumento.Add(oFQ_TipoDocumento);
                }
            }
            return oListaFQ_TipoDocumento;
        }

        public ListaFQ_Candidato ListaCandidatoPaginado(FQ_Candidato oFQ_Candidato, string sortType, int maximumRows, int startRowIndex, out int Total)
        {
            ListaFQ_Candidato oListaFQ_Candidato = new ListaFQ_Candidato();
            DbCommand oDbCommand = oDatabase.GetStoredProcCommand(Procedimientos.USP_SEL_FQ_CANDIDATO_PAGINADO);
            oDatabase.AddInParameter(oDbCommand, "@TipoCandidato_ID", DbType.Int32, oFQ_Candidato.FQ_TipoCandidato.TipoCandidato_ID);
            oDatabase.AddInParameter(oDbCommand, "@TipoDocumento_ID", DbType.String, oFQ_Candidato.FQ_TipoDocumento.TipoDocumento_ID);
            oDatabase.AddInParameter(oDbCommand, "@numeroDocumento", DbType.String, oFQ_Candidato.NumeroDocumento);
            oDatabase.AddInParameter(oDbCommand, "@Nombre", DbType.String, oFQ_Candidato.Nombre);
            oDatabase.AddInParameter(oDbCommand, "@sortType", DbType.String, sortType);
            oDatabase.AddInParameter(oDbCommand, "@maximumRows", DbType.Int32, maximumRows);
            oDatabase.AddInParameter(oDbCommand, "@startRowIndex", DbType.Int32, startRowIndex);
            oDatabase.AddOutParameter(oDbCommand, "@Total", DbType.Int32, 10);
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(oDbCommand))
            {
                int indiceFQ_Candidato_ID = oIDataReader.GetOrdinal("FQ_Candidato_ID");
                int indiceTipoCandidato = oIDataReader.GetOrdinal("TipoCandidato");
                int indiceNombre = oIDataReader.GetOrdinal("Nombre");
                int indiceTipoDocumento = oIDataReader.GetOrdinal("TipoDocumento");
                int indicenumeroDocumento = oIDataReader.GetOrdinal("numeroDocumento");
                int indicedireccion = oIDataReader.GetOrdinal("direccion");
                int indicetelefonoFijo = oIDataReader.GetOrdinal("telefonoFijo");
                int indicetelefonoMovil = oIDataReader.GetOrdinal("telefonoMovil");
                int indicecorreoElectronico = oIDataReader.GetOrdinal("correoElectronico");
                while (oIDataReader.Read())
                {
                    oFQ_Candidato = new FQ_Candidato();
                    oFQ_Candidato.FQ_TipoCandidato = new FQ_TipoCandidato();
                    oFQ_Candidato.FQ_TipoDocumento = new FQ_TipoDocumento();
                    oFQ_Candidato.FQ_Candidato_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Candidato_ID]);
                    oFQ_Candidato.FQ_TipoCandidato.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indiceTipoCandidato]);
                    oFQ_Candidato.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indiceNombre]);
                    oFQ_Candidato.FQ_TipoDocumento.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indiceTipoDocumento]);
                    oFQ_Candidato.NumeroDocumento = DataUtil.DbValueToDefault<String>(oIDataReader[indicenumeroDocumento]);
                    oFQ_Candidato.Direccion = DataUtil.DbValueToDefault<String>(oIDataReader[indicedireccion]);
                    oFQ_Candidato.TelefonoFijo = DataUtil.DbValueToDefault<String>(oIDataReader[indicetelefonoFijo]);
                    oFQ_Candidato.TelefonoMovil = DataUtil.DbValueToDefault<String>(oIDataReader[indicetelefonoMovil]);
                    oFQ_Candidato.correoElectronico = DataUtil.DbValueToDefault<String>(oIDataReader[indicecorreoElectronico]);
                    oListaFQ_Candidato.Add(oFQ_Candidato);
                }
            }
            Total = Convert.ToInt32(oDatabase.GetParameterValue(oDbCommand, "@Total"));
            return oListaFQ_Candidato;
        }

        public int CrearCandidato(FQ_Candidato oFQ_Candidato)
        {
            int resultado = oDatabase.ExecuteNonQuery(Procedimientos.USP_INS_FQ_CANDIDATO,
                oFQ_Candidato.FQ_TipoCandidato.TipoCandidato_ID,
                oFQ_Candidato.FQ_TipoDocumento.TipoDocumento_ID,
                oFQ_Candidato.FQ_Distrito.FQ_Distrito_ID,
                oFQ_Candidato.NumeroDocumento,
                oFQ_Candidato.Nombre,
                oFQ_Candidato.Apellidos,
                oFQ_Candidato.FechaNacimiento,
                oFQ_Candidato.SectorEconomico,
                oFQ_Candidato.Direccion,
                oFQ_Candidato.TelefonoFijo,
                oFQ_Candidato.TelefonoMovil,
                oFQ_Candidato.NumeroFax,
                oFQ_Candidato.correoElectronico,
                oFQ_Candidato.paginaWeb
            );
            return resultado;
        }

        public int ActualizarCandidato(FQ_Candidato oFQ_Candidato)
        {
            int resultado = oDatabase.ExecuteNonQuery(Procedimientos.USP_UPD_FQ_CANDIDATO,
                oFQ_Candidato.FQ_Candidato_ID,
                oFQ_Candidato.FQ_TipoCandidato.TipoCandidato_ID,
                oFQ_Candidato.FQ_TipoDocumento.TipoDocumento_ID,
                oFQ_Candidato.FQ_Distrito.FQ_Distrito_ID,
                oFQ_Candidato.NumeroDocumento,
                oFQ_Candidato.Nombre,
                oFQ_Candidato.Apellidos,
                oFQ_Candidato.FechaNacimiento,
                oFQ_Candidato.SectorEconomico,
                oFQ_Candidato.Direccion,
                oFQ_Candidato.TelefonoFijo,
                oFQ_Candidato.TelefonoMovil,
                oFQ_Candidato.NumeroFax,
                oFQ_Candidato.correoElectronico,
                oFQ_Candidato.paginaWeb
            );
            if (resultado == 1)
            {
                return resultado = 3;
            }
            else {
                return resultado;
            }            
        }

        public int EliminarCandidato(FQ_Candidato oFQ_Candidato)
        {
            int resultado = oDatabase.ExecuteNonQuery(Procedimientos.USP_DEL_FQ_CANDIDATO,
                oFQ_Candidato.FQ_Candidato_ID
            );
            return resultado;
        }

        public FQ_Candidato SeleccionarCandidato_Por_ID(Int32 FQ_Candidato_ID)
        {
            FQ_Candidato oFQ_Candidato = new FQ_Candidato();
            using (IDataReader oIDataReader = oDatabase.ExecuteReader(Procedimientos.USP_SEL_FQ_CANDIDATO_ID,
                FQ_Candidato_ID
            ))
            {
                int indiceFQ_Candidato_ID = oIDataReader.GetOrdinal("FQ_Candidato_ID");
                int indiceTipoCandidato_ID = oIDataReader.GetOrdinal("TipoCandidato_ID");
                int indiceTipoDocumento_ID = oIDataReader.GetOrdinal("TipoDocumento_ID");
                int indiceFQ_Distrito_ID = oIDataReader.GetOrdinal("FQ_Distrito_ID");
                int indeceFQ_Provincia_ID = oIDataReader.GetOrdinal("FQ_Provincia_ID");
                int indiceFQ_Departamento_ID = oIDataReader.GetOrdinal("FQ_Departamento_ID");
                int indicenumeroDocumento = oIDataReader.GetOrdinal("numeroDocumento");
                int indiceNombre = oIDataReader.GetOrdinal("Nombre");
                int indiceapellidos = oIDataReader.GetOrdinal("apellidos");
                int indeceFechaNacimiento = oIDataReader.GetOrdinal("FechaNacimiento");
                int indicesectorEconomico = oIDataReader.GetOrdinal("sectorEconomico");
                int indicedireccion = oIDataReader.GetOrdinal("direccion");
                int indicetelefonoFijo = oIDataReader.GetOrdinal("telefonoFijo");
                int indicetelefonoMovil = oIDataReader.GetOrdinal("telefonoMovil");
                int indicenumeroFax = oIDataReader.GetOrdinal("numeroFax");
                int indicecorreoElectronico = oIDataReader.GetOrdinal("correoElectronico");

                if (oIDataReader.Read())
                {
                    oFQ_Candidato = new FQ_Candidato();
                    oFQ_Candidato.FQ_TipoCandidato = new FQ_TipoCandidato();
                    oFQ_Candidato.FQ_TipoDocumento = new FQ_TipoDocumento();
                    oFQ_Candidato.FQ_Distrito = new FQ_Distrito();
                    oFQ_Candidato.FQ_Distrito.FQ_Provincia = new FQ_Provincia();
                    oFQ_Candidato.FQ_Distrito.FQ_Provincia.FQ_Departamento = new FQ_Departamento();
                    oFQ_Candidato.FQ_Candidato_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Candidato_ID]);
                    oFQ_Candidato.FQ_TipoCandidato.TipoCandidato_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceTipoCandidato_ID]);
                    oFQ_Candidato.FQ_TipoDocumento.TipoDocumento_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceTipoDocumento_ID]);
                    oFQ_Candidato.FQ_Distrito.FQ_Distrito_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Distrito_ID]);
                    oFQ_Candidato.FQ_Distrito.FQ_Provincia.FQ_Provincia_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indeceFQ_Provincia_ID]);
                    oFQ_Candidato.FQ_Distrito.FQ_Provincia.FQ_Departamento.FQ_Departamento_ID = DataUtil.DbValueToDefault<Int32>(oIDataReader[indiceFQ_Departamento_ID]);
                    oFQ_Candidato.NumeroDocumento = DataUtil.DbValueToDefault<String>(oIDataReader[indicenumeroDocumento]);
                    oFQ_Candidato.Nombre = DataUtil.DbValueToDefault<String>(oIDataReader[indiceNombre]);
                    oFQ_Candidato.Apellidos = DataUtil.DbValueToDefault<String>(oIDataReader[indiceapellidos]);
                    oFQ_Candidato.FechaNacimiento = DataUtil.DbValueToDefault<DateTime>(oIDataReader[indeceFechaNacimiento]);
                    oFQ_Candidato.SectorEconomico = DataUtil.DbValueToDefault<String>(oIDataReader[indicesectorEconomico]);
                    oFQ_Candidato.Direccion = DataUtil.DbValueToDefault<String>(oIDataReader[indicedireccion]);
                    oFQ_Candidato.TelefonoFijo = DataUtil.DbValueToDefault<String>(oIDataReader[indicetelefonoFijo]);
                    oFQ_Candidato.TelefonoMovil = DataUtil.DbValueToDefault<String>(oIDataReader[indicetelefonoMovil]);
                    oFQ_Candidato.NumeroFax = DataUtil.DbValueToDefault<String>(oIDataReader[indicenumeroFax]);
                    oFQ_Candidato.correoElectronico = DataUtil.DbValueToDefault<String>(oIDataReader[indicecorreoElectronico]);
                }
            }
            return oFQ_Candidato;
        }    

    }
}
